package com.tanhua.sso.service;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.tanhua.common.exception.BusinessException;
import com.tanhua.common.pojo.User;
import com.tanhua.common.vo.ErrorResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @ClassName: UsersService
 * @Author:王晨晗
 * @Description: 我的
 * @Date: 2022/01/10/11:03
 */
@Service
@Slf4j
public class UsersService {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate<String , String> redisTemplate;

    /**
     * @description 发送验证码
     * @param token 用户令牌
     * @return
     */
    public void sendVerificationCode(String token) {
        //校验token
        User user = userService.queryToken(token);
        //判断user是否解析成功
        if (ObjectUtil.isEmpty(user)){
            throw new BusinessException(ErrorResult.tokenError());   //为空 解析失败,抛出异常
        }
        //调用发送验证码的方法
        userService.sendCode(user.getMobile());
    }

    /**
     * @description 更换手机号-校验验证码
     * @param token
     * @param code
     * @return
     */
    public Map<String, Object> checkVerificationCode(String token, String code) {
        //校验token是否合法
        User user = userService.queryToken(token);
        //创建响应数据Map集合
        Map<String , Object> result = new HashMap<>();
        //判断user是否解析成功
        if (user == null){
            //解析失败 填充响应集合
            result.put("verification" , false);
            //打印日志信息
            log.error("token解析失败~~~ , token=" + token);
        }
        //获取redis键
        String redisKey = "CHECK_CODE_" + user.getMobile();
        //获取键对应的值
        String redisCode = redisTemplate.opsForValue().get(redisKey);
        //校验验证码是否一致
        if (StrUtil.equals(redisCode , code)){
            //校验一致,删除redis中验证码
            redisTemplate.delete(redisKey);
            //封装响应map
            result.put("verification" , true);
        }else {
            //验证码校验失败 ,封装失败响应的数据
            result.put("verification" , false);
        }
        //返回结果
        return result;
    }

    /**
     * @description 用户手机号更改-保存新手机号
     * @param token     令牌
     * @param newPhone  新手机号;
     * @return
     */
    public void saveNewPhone(String token, String newPhone) {
        //校验token
        User user = userService.queryToken(token);
        //判断user是否为空
        if (user == null){
            throw new BusinessException(ErrorResult.tokenError());   //为空 解析失败,抛出异常
        }
        //执行保存手机号
        userService.updatePhone(user.getId() , newPhone);
    }
}
